package com.wyr.common.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.tags.Tag;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * Swagger (OpenAPI 3) 配置类，兼容 Knife4j 显示与接口美化。
 * <p>
 * 提供：
 * 1. OpenAPI 元信息（标题、作者、协议等）
 * 2. 为 tags 与 paths 添加扩展字段，提升文档可读性（x-order, x-***）
 *
 * @author wangyiren
 * @version 1.0
 * &#064;title SwaggerConfig
 * &#064;description
 * &#064;date 2025/03/06 15:53
 */
@Configuration
public class SwaggerConfigure {

    /**
     * 为 OpenAPI 文档添加自定义扩展字段：
     * - tags 增加 x-order 字段以控制顺序（Knife4j 支持）
     * - paths 增加扩展字段示例
     */
    @Bean
    public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
        return openApi -> {
            if (openApi.getTags() != null) {
                int order = 1;
                for (Tag tag : openApi.getTags()) {
                    Map<String, Object> extensions = new HashMap<>(1);
                    extensions.put("x-order", order++); // 顺序从 1 开始递增
                    tag.setExtensions(extensions);
                }
            }

            if (openApi.getPaths() != null) {
                // 给整个 OpenAPI 文档添加扩展字段（可以用于前端识别）
                openApi.addExtension("x-ui-meta", "powered-by-zhuopai");

                // 给 paths 节点添加扩展字段（不影响功能，仅供 UI 展示使用）
                openApi.getPaths().addExtension("x-path-order", 1001);
            }
        };
    }

    /**
     * OpenAPI 信息定义（标题、版本、作者、License 等）
     */
    @Bean
    public OpenAPI customOpenApi() {
        return new OpenAPI()
                .info(new Info()
                        .title("AIWALK-API 接口文档")
                        .version("1.0")
                        .description("AI 行业中台接口文档")
                        .termsOfService("https://www.zhuopai.top/terms")
                        .contact(new Contact()
                                .name("wangyiren")
                                .url("https://www.zhuopai.top/")
                                .email("contact@zhuopai.top"))
                        .license(new License()
                                .name("Apache License 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html"))
                );
    }
}
